package ntd.util.util.metadata;

import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.StrUtil;
import com.ToolOpt;
import ntd.util.config.common.bo.ComDictVo;
import ntd.util.config.common.enums.FactoryEnum;
import ntd.util.config.common.enums.meta.EnumMetaType;
import ntd.util.frame.action.database.bo.FieldMemoBo;
import ntd.util.frame.data.bo.MetaTableField;
import ntd.util.util.UtilEnum;
import org.apache.commons.lang3.StringUtils;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class UtilMetaDataTwo {

    public static void transformMetaDataBO(MetaTableField metaTableField) {

        // 数据类型封装
        metaTableField.setType(getTypeInt(metaTableField));

        // 数据库备注生成字典选项
        FieldMemoBo fieldMemoBo = FieldMemoBo.transform(metaTableField.getMemo());
        metaTableField.setMemo(fieldMemoBo.getName());
        metaTableField.setDictList(fieldMemoBo.getComDictVoList());

        // 字典表封装字典选项
        if (CollectionUtil.isEmpty(metaTableField.getDictList())) {
            metaTableField.setDictList(handleDict(metaTableField));
        }
    }

    public static int getTypeInt(MetaTableField field) {
        LinkedHashMap<String, EnumMetaType> enumMap = EnumUtil.getEnumMap(EnumMetaType.class);
        for (Map.Entry<String, EnumMetaType> entry : enumMap.entrySet()) {
            EnumMetaType enumMetaType = entry.getValue();
            if (StrUtil.startWith(field.getName(), enumMetaType.getPrefix())) {
                return enumMetaType.getCode();
            }
        }
        switch (field.getEnumDataType()) {
            case NUMBER: return 2;
            case DATE: return 3;
            default: return 1;
        }
    }

    private static List<ComDictVo> handleDict(MetaTableField field) {
        String name = field.getName();

        if (EnumMetaType.NUMBER_STATUS.getCode().equals(field.getType())) {
            return UtilEnum.generateDictEnum(FactoryEnum.getEnumClass("status"));
        }

        if (StringUtils.startsWith(name, "dict")) {
            String code = StrUtil.removePrefix(name, "dict_");
            return CollStreamUtil.toList(ToolOpt.OPT_S_DICT.listByCode(code), dict -> new ComDictVo(dict.getName(), dict.getId()));
        }

        if (StrUtil.startWith(name, "enum")) {
            String anEnum = StrUtil.removePrefix(name, "enum_");
            return UtilEnum.generateDictEnum(FactoryEnum.getEnumClass(anEnum));
        }

        return null;
    }
}
